#include "fase.h"
#include "fase1.h"
#include "tubarao.h"
#include "inimigoMedio.h"
#include "iostream" 

fase1::fase1() : fase() {
	fundoTela.carregar("sources/images/fase01.bmp", "sources/images/fase01pedras.bmp");
	posicaoBackground = 0;	
}

fase1::~fase1()
{

}

void fase1::desenhar(SDL_Surface *screen) {
	fundoTela.desenhar(screen, posicaoBackground);
	posicaoBackground += 1;

	list<Missil*>::iterator itM = misseis.begin();
	while (itM != misseis.end()) {
		(*itM)->desenhar(screen);
		itM++;
	}

	list<Inimigo*>::iterator it = inimigos.begin();
	while (it != inimigos.end()) {
		(*it)->desenhar(screen);
		it++;
	}
	
	list<Efeito*>::iterator itE = efeitos.begin();
	while (itE != efeitos.end()) {
		(*itE)->desenhar(screen);
		
		if( (*itE)->frameAtual == 0)
			itE = efeitos.erase(itE);
		else
			itE++;
	}

}

void fase1::desenharChefe(SDL_Surface *screen)
{
	fundoTela.desenharChefe(screen);

	list<Missil*>::iterator itM = misseis.begin();
	while (itM != misseis.end()) {
		(*itM)->desenhar(screen);
		itM++;
	}

	list<Efeito*>::iterator itE = efeitos.begin();
	while (itE != efeitos.end()) {
		(*itE)->desenhar(screen);
		
		if( (*itE)->frameAtual == 0)
			itE = efeitos.erase(itE);
		else
			itE++;
	}
}

void fase::adicionarInimigo(SDL_Surface *screen, Jogador *jogador)
{
	int oY;
	int oX;
	Inimigo *tubarao = new Tubarao();
	Inimigo *inimigoMedio = new InimigoMedio();

	oY = rand() % (screen->h - tubarao->getRect().h);
	oX = screen->w;
	tubarao->iniciar(oX, oY, jogador->getRect().x, jogador->getRect().y);
	inimigos.push_back(&(*tubarao));

	if(!(posicaoBackground % 400))
	{
		oY = rand() % (screen->h - inimigoMedio->getRect().h);
		oX = screen->w;
		inimigoMedio->iniciar(oX, oY, jogador->getRect().x, jogador->getRect().y);

		inimigos.push_back(&(*inimigoMedio));
	}
}

void fase::update(SDL_Surface *screen, Jogador *jogador)
{
	// Move os misseis
	list<Missil*>::iterator itM = misseis.begin();
	while (itM != misseis.end()) {
		(*itM)->mover();
		
		if ( (*itM)->getRect().x > screen->w )
			itM = misseis.erase(itM);
		else
			itM++;
	}
	
	// Move os inimigos
	list<Inimigo*>::iterator it = inimigos.begin();
	while (it != inimigos.end()) {
		//Implementar TypeOf
		
		//Tubarao *tubarao = static_cast<Tubarao *>(&(*(*it)));
		//tubarao->mover(screen, jogador);

		Inimigo *i = &(*(*it));
		i->mover(screen, jogador);

		bool col = false;
		
		int iX = (*it)->getRect().x;
		int iY = (*it)->getRect().y;
		int iH = (*it)->getRect().h;
		int iW = (*it)->getRect().w;

		// Checa destruicao inimigos
		list<Missil*>::iterator itM = misseis.begin();
		while (itM != misseis.end()) {
			
			int mX = (*itM)->getRect().x;
			int mY = (*itM)->getRect().y;
					
			if ( mX + 30 >= iX && mX <= iX + iW) 
			{
				if (mY + 6 >= iY && mY <= iY + iH)
					col = true;
			}
			
			if (col) 
			{
				itM = misseis.erase(itM);
				break;
			}
			else
				itM++;
		}

		if (((*it)->getRect().x + (*it)->getRect().w) < 0)
			it = inimigos.erase(it);
		else if (col)
		{
			if((*it)->getLife())
			{
				if((*it)->getEnergia() > 0)
				{
					(*it)->setEnergia();
					Efeito *ef = new Efeito();
					ef->iniciar(iX, iY);
					efeitos.push_back(&(*ef));
				}
				else
				{
					it = inimigos.erase(it);
					Efeito *ef = new Efeito();
					ef->iniciar(iX, iY);
					efeitos.push_back(&(*ef));
				}
			}
			else
			{
				it = inimigos.erase(it);
					Efeito *ef = new Efeito();
					ef->iniciar(iX, iY);
					efeitos.push_back(&(*ef));
			}
		}
		else
		{
			// Checa destruicao do jogador
			int jX = jogador->getRect().x;
			int jY = jogador->getRect().y;
			
			bool col = false;
			
			if (jogador->state == 1)
			if (	(jX + 46 >= iX && jX + 46 <= iX + 80) ||
					(jX + 90 >= iX && jX + 90 <= iX + 80)
				)
			{	
				if (jY >= iY && jY <= iY + 43)
				{
					col = true;
				}
				
				if (jY +36 >= iY && jY +36 <= iY + 43)
				{
					col = true;
				}
			}
			
			if (col)
			{
				Efeito *ef = new Efeito();
				ef->iniciar(jX + 40, jY);
				efeitos.push_back(&(*ef));
				printf("morreu");
				jogador->state = 0;
			}
			it++;
		}
	}
	if(!(posicaoBackground % 20))
		adicionarInimigo(screen, jogador);
}

void fase::updateChefe(SDL_Surface *screen, Jogador *jogador)
{
	// Move os misseis
	list<Missil*>::iterator itM = misseis.begin();
	while (itM != misseis.end()) {
		(*itM)->mover();
		
		if ( (*itM)->getRect().x > screen->w )
			itM = misseis.erase(itM);
		else
			itM++;
	}
}